#ifndef _RESOURCE_STORAGE_1A27CF07_FAD4_42F9_8304_FA5B4A316456_
#define _RESOURCE_STORAGE_1A27CF07_FAD4_42F9_8304_FA5B4A316456_
#pragma once
#include "base/win/scoped_handle.h"
#include "base/threading/non_thread_safe.h"
#include "work_thread.h"
#include "url_defines.h"

namespace dl {

struct StorageCreateInfo {
  FilePath  save_path;             // 文件保存路径
  int64     start_position;        // 文件开始存储的位置
};

class StorageFile : public base::RefCounted<StorageFile> {
public:
  explicit StorageFile(const StorageCreateInfo& info);
  ~StorageFile();
  bool Initialize();
  int64 TellPosition() const;
  bool  SeekPosition(int64 position);
  bool AppendData(IOBufferWithSizePtr buffer);
  bool Finished(URLRequestStatus stat);

private:
  bool Open();

private:
  StorageCreateInfo info_;
  base::win::ScopedHandle file_;
	
};
typedef scoped_refptr<StorageFile> StorageFilePtr;

/**
 * 资源数据的本地保存处理
 * 本地文件的写入运行在独立的IO线程中
 */
class ResourceStorage : public base::NonThreadSafe {
public:
  /**
   * 文件存储回调接口
   */
  struct StorageDelegate {
    /**
     * 文件资源准备完毕
     * @param symbol指示资源的标志
     * @param start_position指示资源有效的下载存储点
     */
    virtual void OnCreateStorageCompleted(unsigned int symbol, int64 start_position) = 0;
  };

public:
  explicit ResourceStorage(StorageDelegate* delegate);

  /**
   * 开始创建存储介质
   * @param symbol指示资源的标志
   * @param info指示资源的相关信息
   */
  void CreateStorage(unsigned int symbol, const StorageCreateInfo& info);
  
  /**
   * 定位文件下载位置
   * @param symbol指示资源的标志
   * @param start_position指示资源的开始保存位置
   */
  void PositionStorage(unsigned int symbol, int64 start_position);

  /**
   * 将数据写入文件
   * @param symbol指示资源的标志
   * @param buffer指示要写入的数据
   */
  void WriteToStorage(unsigned int symbol, IOBufferWithSizePtr buffer);

  /**
   * 数据写入完毕
   * @param symbol指示资源的标志
   * @param stat指示结束状态
   */
  void StorageFinished(unsigned int symbol, URLRequestStatus stat);

private:
  typedef base::hash_map<unsigned int, StorageFilePtr> StorageFileMap;
  StorageFileMap storage_files_;
  StorageDelegate* delegate_;
};

}

#endif//_RESOURCE_DOWNLOAD_3CACD5C1_2509_41B5_A233_CDECAC08C51A_